#include "widget.h"
#include "ui_widget.h"
//QTreeWidget树形结构控件
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    create();

    //设置根节点的名字。默认名称:1
    tree_widget->setHeaderLabel("动物");

    //添加顶层节点
    QTreeWidgetItem *item1=new QTreeWidgetItem();
    item1->setText(0,"猫");//0表示下标，代表这是顶层节点
    //添加到顶层节点中
    tree_widget->addTopLevelItem(item1);

    //添加顶层节点
    QTreeWidgetItem *item2=new QTreeWidgetItem();
    item2->setText(0,"狗");//0表示下标，代表这是顶层节点
    //添加到顶层节点中
    tree_widget->addTopLevelItem(item2);

    //添加顶层节点
    QTreeWidgetItem *item3=new QTreeWidgetItem();
    item3->setText(0,"鸟");//0表示下标，代表这是顶层节点
    //添加到顶层节点中
    tree_widget->addTopLevelItem(item3);

    //添加子节点
    QTreeWidgetItem *item4=new QTreeWidgetItem();
    item4->setText(0,"猫1");
    item1->addChild(item4);//添加到指定的节点中

    QTreeWidgetItem *item5=new QTreeWidgetItem();
    item5->setText(0,"狗1");
    item2->addChild(item5);//添加到指定的节点中

    QTreeWidgetItem *item6=new QTreeWidgetItem();
    item6->setText(0,"鸟1");
    item3->addChild(item6);//添加到指定的节点中

    connect(button_topinsert,&QPushButton::clicked,this,&Widget::handler_topadd);
    connect(button_insert,&QPushButton::clicked,this,&Widget::handler_add);
    connect(button_delete,&QPushButton::clicked,this,&Widget::handler_delete);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::create()
{
    tree_widget=new QTreeWidget(this);
    tree_widget->setGeometry(50,50,400,600);

    line_edit=new QLineEdit(this);
    line_edit->setPlaceholderText("请输入要插入节点的名称");
    line_edit->setGeometry(500,100,300,50);

    button_topinsert=new QPushButton(this);
    button_topinsert->setText("新增顶层节点");
    button_topinsert->setGeometry(500,200,200,50);

    button_insert=new QPushButton(this);
    button_insert->setText("添加到选中节点");
    button_insert->setGeometry(500,300,200,50);

    button_delete=new QPushButton(this);
    button_delete->setText("删除选中节点");
    button_delete->setGeometry(500,400,200,50);
}

void Widget::handler_topadd()
{
    //获取当前QLineEdit控件对象中的信息
    const QString str=line_edit->text();
    if(str.isEmpty()==true)
    {
        //如果没有信息，就直接返回
        return;
    }
    //构造一个QTreeWidgetItem对象
    QTreeWidgetItem *item=new QTreeWidgetItem();
    item->setText(0,str);
    //将该节点设置为顶层节点
    tree_widget->addTopLevelItem(item);
    //清空输入框中的信息
    line_edit->clear();
}

void Widget::handler_add()
{
    //获取当前选中的节点
    QTreeWidgetItem *current=tree_widget->currentItem();
    if(current==nullptr)
    {
        //如果选中的节点为空，就退出(没有选中节点)
        return;
    }
    //获取输入框中的信息
    const QString str=line_edit->text();
    if(str.isEmpty()==true)
    {
        //如果信息为空，就退出
        return;
    }
    //构造QTreeWidgetItem对象
    QTreeWidgetItem *item=new QTreeWidgetItem();
    item->setText(0,str);
    //将该节点设置到选中节点的子节点
    current->addChild(item);
    //清空输入框中的信息
    line_edit->clear();
}

void Widget::handler_delete()
{
    //获取当前选中的节点信息
    QTreeWidgetItem *current=tree_widget->currentItem();
    if(current==nullptr)
    {
        return;
    }
    //拿到当前选中的节点的父节点
    QTreeWidgetItem *parent=current->parent();
    if(parent==nullptr)
    {
        //说明选中的节点是顶层节点,顶层节点的父节点为空
        //获取当前顶层节点的下标
        int index=tree_widget->indexOfTopLevelItem(current);
        //根据下标，删除这个顶层节点
        tree_widget->takeTopLevelItem(index);
    }
    else
    {
        //此节点是非顶层节点
        //利用父节点进行删除即可
        parent->removeChild(current);
    }
}

